风格迁移
本期做一个笔者认为神奇的实现,将一张真实的照片加入名画的风格生成一张新的照片。
论文地址:A Neural Algorithm of Artistic Style
首先介绍两个前置知识点,VGG和迁移学习
VGG
结构可以看成由CNN和FC组成,CNN(本期我们只会用到这一部分)又由五个Block组成:k个CNN3X3 + MaxPool。本期使用图中的E,VGG19。
迁移学习 导入已经训练好的模型参数来训练我们自己的模型,Pytorch使用迁移学习非常方便。
论文浅析
论文前半部分描述了实践和理解,确实可以做出比较理想的结果,但是笔者私以为数学支撑比较薄弱。
所以笔者直接从章节Methods开始说:
- 首先,整个图片融合过程有三张图片:1、实际照片(下称p),2、名画(下称s),3、融合1和2的生成照片(下称x)。
- 融合分两步:1、x和p在vgg的某几层使用Mean Squared Error来计算loss,2、x和s的矫正就有些微不同,论文中将图片降维后使用Matrix来存放各自特征,然后使用Mean Squared Error来计算loss。
- 最后,上述所有loss相加后BP。
这里需要注意一点:整个训练流程VGG、p、s一直不变,只有x的参数在随BP更新
代码实现
首先提取已训练好的vgg参数来构建我们的模型
加载VGG19并导入已训练好的参数,行60, 65
而我们的模型构建就非常简单了,行40~55
Style Loss
图片的提取和保存点我查看,这里不在详述。
优化函数使用的LBFGS,代码:
结果
梵高-星空
毕加索